package com.cy.interfacetest.policyinterface;

import java.util.List;

/**
 * 硬件模块管控接口
 */
public interface IPolicyManager {

    /**
     * @return 系统完整性未被破坏返回 true；系统完整性被破坏返回 false
     */
    boolean getSystemIntegrity();

    /**
     * @return 返回终端可信检测结果
     */
    String getTpmReport();

    /**
     * @param mode ：功能模式
     *             0：禁止终端使用无线网络；
     *             1：只允许终端进行无线网络指纹扫描。
     * @return 成功返回 true；失败返回 false
     */
    public boolean setWlanPolicies(int mode);


    /**
     * @return 返回值为当前 WLAN 管控策略状态，参见 setWlanPolicies 方法的参数 mode。
     */
    public int getWlanPolicies();

    /**
     * @param mode 0：强制关闭终端的移动数据网络，且不允许用户开启；
     *             1：强制开启终端的移动数据网络，且不允许用户关闭；
     *             2：允许用户自主控制终端移动数据网络的开关
     * @return
     */
    public boolean setDataConnectivityPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setDataConnectivityPolicies 方法的参数 mode
     */
    public int getDataConnectivityPolicies();

    /**
     * @param mode              0：不允许终端使用蓝牙；
     *                          1：仅允许与准许蓝牙连接列表内的蓝牙设备建立蓝牙连接，列表可根据目标设备的蓝牙 MAC地址进行定义。
     * @param bluetoothInfoList bluetoothInfoList：仅当 mode=1 时有效，数组中每一项为一个 JSON 格式字符串，格式如下：{"Mac":"00-11-22-33-44-55"}
     * @return
     */
    public boolean setBluetoothPolicies(int mode, String[] bluetoothInfoList);


    /**
     * @return 返回值为当前蓝牙管控策略状态
     * string[0]：功能模式，参见 setBluetoothPolicies 方法的 mode 参数。
     * string[1]至 string[n-1]：仅当 mode=1 时返回允许连接的特定蓝牙网络信息，参见
     * setBluetoothPolicies 方法的 BluetoothInfoList 参数
     */
    public String[] getBluetoothPolicies();

    /**
     * @param mode 0：不允许终端启用 NFC 功能；
     *             1：强制终端开启NFC功能；
     *             2：允许用户自主控制 NFC 功能的开关
     * @return
     */
    public boolean setNfcPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setNfcPolicies 方法的参数 mode
     */
    public int getNfcPolicies();

    /**
     * @param mode 0：不允许终端使用红外功能；
     *             1：允许终端使用红外功能
     * @return
     */
    public boolean setIrPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setIrPolicies 方法的参数 mode
     */
    public int getIrPolicies();

    /**
     * @param mode 0：禁止终端使用生物特征识别识别模块；
     *             1：允许终端使用生物特征识别模块
     * @return
     */
    public boolean setBiometricRecognitionPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setBiometricRecognitionPolicies 方法的参数 mode。
     */
    public int getBiometricRecognitionPolicies();

    /**
     * @param mode 0：禁止终端使用定位服务；
     *             1：强制终端开启定位服务，且不允许关闭；
     *             2：不对定位服务的开关和使用进行控制
     * @return
     */
    public boolean setGpsPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setGpsPolicies 方法的参数 mode。
     */
    public int getGpsPolicies();


    /**
     * @param mode 0：不允许终端通过 USB 接口进行数据传输，仅允许充电模式；
     *             1：不控制 USB 接口的工作模式，支持 MTP 模式、PTP 模式、HOST 模式进行数据传输与调试
     *             模式
     * @return
     */
    public boolean setUsbDataPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setUsbDataPolicies 方法的参数 mode。
     */
    public int getUsbDataPolicies();

    /**
     * @param mode 0：不允许终端对扩展存储进行读写操作；
     *             1：仅允许终端对扩展存储进行读操作；
     *             2：允许终端对扩展存储进行读、写操作
     * @return
     */
    public boolean setExternalStoragePolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setExternalStoragePolicies 方法的参数 mode
     */
    public int getExternalStoragePolicies();

    /**
     * @param mode 0：不允许使用终端的麦克风；
     *             1：允许使用终端的麦克风
     * @return 成功返回 true；失败返回 false
     */
    public boolean setMicrophonePolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setMicrophonePolicies 方法的参数 mode。
     */
    public int getMicrophonePolicies();

    /**
     * @param mode 0：不允许使用终端的扬声器；
     *             1：允许使用终端的扬声器
     * @return
     */
    public boolean setSpeakerPolicies(int mode);


    /**
     * @return 返回值为当前功能模式，参见 setSpeakerPolicies 方法的参数 mode。
     */
    public int getSpeakerPolicies();

    /**
     * @param mode 0：不允许使用终端的摄像头；
     *             1：允许使用终端的摄像头
     * @return
     */
    public boolean setCameraPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setCameraPolicies 方法的参数 mode。
     */
    public int getCameraPolicies();

    /**
     * @param mode 0：不允许使用终端的闪光灯；
     *             1：允许使用终端的闪光灯。
     * @return
     */
    public boolean setFlashPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setFlashPolicies 方法的参数 mode
     */
    public int getFlashPolicies();

    /**
     * @param mode 0：不允许终端连接扩展外设；
     *             1：允许终端连接扩展外设。
     * @return
     */
    public boolean setPeripheralPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setPeripheralPolicies 方法的参数 mode
     */
    public int getPeripheralPolicies();


    /**
     * @param mode 0：禁用通话功能；
     *             1：允许通话功能。
     * @return 成功返回 true；失败返回 false。
     */
    boolean setVoicePolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setVoicePolicies 方法的参数 mode。
     */
    int getVoicePolicies();

    /**
     * @param mode   0：禁用短信功能；
     *               1：允许短信功能。
     * @param regExp
     * @return
     */
    boolean setSmsPolicies(int mode, String regExp);

    /**
     * @return 返回值为当前功能模式，参见 setSmsPolicies 方法的参数 mode。
     */
    int getSmsPolicies();

    /**
     * @param mode 0：禁用截屏/录屏功能；
     *             1：允许截屏/录屏功能。
     * @return
     */
    boolean setCaptureScreenPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setCaptureScreenPolicies 方法的参数 mode。
     */
    int getCaptureScreenPolicies();


    /**
     * @param mode        0：禁止终端使用网络共享功能；
     *                    1：允许终端启用网络共享功能，但只允许列表中指定 MAC 地址的设备接入。
     *                    macInfoList：仅当 mode=1 时有效，数组中每一项为一个 JSON 格式字符串，格式如下：
     *                    "00-11-22-33-44-55"。
     * @param macInfoList
     * @return
     */
    boolean setWlanApPolicies(int mode, String[] macInfoList);

    /**
     * 返回值为当前网络共享管控策略状态
     * string[0]：功能模式，参见 setWlanApPolicies 方法的 mode 参数。
     * string[1]至 string[n-1]：仅当 mode=1 时返回允许接入的特定 MAC 地址信息，参见
     * setWlanApPolicies 方法的 macInfoList 参数
     *
     * @return
     */
    String[] getWlanApPolicies();

    /**
     * @param mode 0：不允许用户增加、删除、修改、查看 APN 配置以及选择 APN；
     *             1：仅允许用户查看 APN 配置，但不允许其他操作；
     *             2：允许用户增加、删除、修改、查看 APN 信息，及选择使用的 APN。
     * @return
     */
    boolean setUserApnMgrPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 getUserApnMgrPolicies 方法的参数 mode
     */
    int getUserApnMgrPolicies();

    /**
     * @param mode 0：要求设置字母数字混合密码，并对密码合规性进行检查；
     *             1：要求设置简单数字密码，并对密码合规性进行检查；
     *             2：要求启用生物识别技术；
     *             3：允许用户自行设定密码策略，不进行统一管控。
     * @return
     */
    boolean setUserPasswordPolicies(int mode);

    /**
     * @return 返回值为当前功能模式，参见 setUserPasswordPolicies 方法的参数 mode。
     */
    int getUserPasswordPolicies();

    /**
     * @param mode 0：不允许用户或应用修改本机时间及时间来源，并强制同步移动网络时间；
     *             1：允许用户或应用修改本机时间，以及设定时间来源。
     * @return
     */
    boolean setUserTimeMgrPolicies(int mode);

    int getUserTimeMgrPolicies();

    /**
     * @param mode 0：不允许用户在设置菜单中对终端进行恢复出厂设置的操作；
     *             1：允许用户在设置菜单中对终端进行恢复出厂设置的操作。
     * @return
     */
    boolean setFactoryResetPolicies(int mode);

    int getFactoryResetPolicies();

    /**
     * @param mode 0：不允许用户开启开发模式；
     *             1：允许用户开启开发模式。
     * @return
     */
    boolean setDevelopmentModePolicies(int mode);

    int getDevelopmentModePolicies();

    /**
     * @param mode 0：不允许用户在设置菜单中对终端操作系统进行升级的操作；
     *             1：允许用户在设置菜单中对终端操作系统进行升级的操作
     * @return
     */
    boolean setSystemUpdatePolicies(int mode);

    int getSystemUpdatePolicies();

    /**
     * @param mode    0：不允许任何终端应用调用应用交互式安装/卸载接口；
     *                1：仅允许接口授权列表指定的终端应用调用应用交互式安装/卸载接口，接口授权列表包含
     *                应用包名和应用签名证书指纹值；
     *                2：允许所有应用调用应用交互式安装/卸载接口。
     * @param appList appList：仅当 mode=1 时有效，数组中每一项为一个 JSON 格式字符串，格式如下：
     *                * {"AppPackageName":"应用包名","CertificateHash":"证书 Sha1 哈希值 16 进制字符串"}
     * @return
     */
    boolean setInstallUninstallPolicies(int mode, String[] appList);

    /**
     * @return 返回值为当前交互式安装/卸载接口管控状态
     * string[0]：功能模式，参见 setInstallUninstallPolicies 方法的 mode 参数。
     * string[1]至 string[n-1]：仅当 mode=1 时返回允许交互式安装/卸载的特定 APP 信息，参见
     * setInstallUninstallPolicies 方法的 appList 参数。
     */
    String[] getInstallUninstallPolicies();

    /**
     * @param mode    0：不允许所有应用调用应用静默安装/卸载接口；
     *                1：仅允许接口授权列表内的终端应用调用应用静默安装/卸载接口，接口授权列表包含应用
     *                包名和应用签名证书指纹值；
     *                2：允许所有应用调用应用静默安装/卸载接口。
     * @param appList 仅当 mode=0 时有效，数组中每一项为一个 JSON 格式字符串，格式如下：
     *                {"AppPackageName":"应用包名","CertificateHash":"证书 Sha1 哈希值 16 进制字符串"}。
     *                成功返回 true；失败返回 false。
     */
    boolean setSilentInstallUninstallPolicies(int mode, String[] appList);

    /**
     * @return 返回值为当前静默安装/卸载接口管控状态
     * string[0]：功能模式，参见 setSilentInstallUninstallPolicies 方法的 mode 参数。
     * string[1]至 string[n-1]：仅当 mode=1 时返回允许静默安装/卸载的特定 APP 信息，参见
     * setSilentInstallUninstallPolicies 方法的 appList 参数。
     */
    String[] getSilentInstallUninstallPolicies();


    /**
     * @param mode 0：允许使用 ADB 方式安装/卸载终端应用；
     *             1：不允许使用 ADB 方式安装/卸载终端应用
     * @return
     */
    boolean setAdbInstallUninstallPolicies(int mode);

    int getAdbInstallUninstallPolicies();


    /**
     * 数据擦除 恢复出厂
     *
     * @return
     */
    boolean wipeDeviceData();

    /**
     * 重启设备
     *
     * @return
     */
    boolean rebootDevice();


    /**
     * 终端关机
     *
     * @return
     */
    boolean shutdownDevice();

    /**
     * WLAN 配置
     *
     * @param wlanConfig ：WLAN 参数，采用 JSON 数组格式，数组中每一项对应一条 WLAN 信息：
     *                   * [{"ssid":"Tenda_2E5560","bssid":"c8:3a:35:2e:55:60","pwd":"12345678"},
     *                   * {"ssid":"cisco-60A8","bssid":"d8:24:bd:76:60:aa","pwd":"0123456789"}]。
     * @return
     */
    boolean setWlanConfiguration(String wlanConfig);


    /**
     * 增加 APN
     *
     * @param apnInfo apnInfo：APN 信息，采用 JSON 格式。"name"：APN ᧿述（用于显示标题）；"apn"：APN 名称；"type"：APN 类型，如"default,supl"；
     *                "numeric"：运营商网络码，一般通过 getSimOperator 获取；"mcc"：MCC； "mnc"：MNC； "proxy"：代理；"port"：端口；"mmsproxy"：彩信代理；
     *                "mmsport"：彩信端口； "user"：用户名； "server"：服务器；"password"：密码； "mmsc"：MMSC。
     * @return 成功返回新创建 APN ID；失败返回-1
     */
    int createApn(String apnInfo);

    /**
     * apnId：APN 标识 ID。
     *
     * @param apnId
     * @return
     */
    boolean deleteApn(int apnId);

    /**
     * apnId：APN 标识 ID。
     * 成功返回 true；失败返回 false
     *
     * @param apnId
     * @return
     */
    boolean setCurrentApn(int apnId);

    /**
     * 查询 APN 列表
     *
     * @return 成功返回 APN id 列表（与用户可见的列表数量和列表项一致）；失败返回空
     */
    List<Integer> getApnList();

    /**
     * @param apnId APN 标识 ID。
     * @return 成功返回 APN 信息，参见创建 APN 接口参数定义；失败返回空
     */
    String getApnInfo(int apnId);

    /**
     * mode：系统使用模式切换管控开关
     * 0：不允许用户切换系统使用模式；
     * 1：允许用户切换系统使用模式。
     * 成功返回 true；失败返回 false。
     *
     * @param mode
     * @return
     */
    boolean setContainerPolicies(int mode);

    /**
     * 返回值为系统使用模式切换管控开关当前状态
     *
     * @return
     */
    int getContainerPolicies();

    int getContainerTotalNumber();


    /**
     * containerNumber：系统使用模式序号
     * 0：安全等级最低的使用模式；
     * 1~N-1：安全等级逐步ᨀ高，其中 N 为系统使用模式总数。
     *
     * @param containerNumber
     * @return
     */
    boolean setContainerNumber(int containerNumber);

    /**
     * 返回值为当前激活的系统使用模式序号
     *
     * @return
     */
    int getContainerNumber();


    /**
     * 所处使用模式当前为激活状态（处于前台）返回 true；所处使用模式当前为非激活状态（处于
     * 后台）返回 false。
     */
    boolean isActived();

    /**
     * 应用安装控制
     *
     * @param mode：应用名单类型     0：黑名单(应用包名列表中的所有项都不允许安装)；
     *                        1：白名单(只允许安装应用包名列表中的项)。
     * @param appPackageNames 0：黑名单(应用包名列表中的所有项都不允许安装)；
     *                        1：白名单(只允许安装应用包名列表中的项)。
     *                        appPackageNames：应用包名列表。当 appPackageNames 为空时，取消所有已设定的应用。
     *                        成功返回 true；失败返回 false。
     * @return
     */
    boolean setAppInstallationPolicies(int mode, String[] appPackageNames);

    /**
     * 应用静默安装
     *
     * @param pathToAPK APK 文件完整路径。
     * @return * 成功返回 true；失败返回 false。
     */
    boolean installPackage(String pathToAPK);

    /**
     * 应用静默卸载
     *
     * @param appPackageName 应用包名。
     * @return 成功返回 true；失败返回 false
     */
    boolean uninstallPackage(String appPackageName);

    /**
     * 应用卸载控制
     * mode：应用名单类型
     *
     * @param mode            0：黑名单(应用包名列表中的所有项均强制卸载)；
     *                        1：白名单(应用包名列表中的所有项禁止卸载)。
     * @param appPackageNames appPackageNames：应用包名列表。当 appPackageNames 为空时，取消所有已设定的应用。
     * @return 成功返回 true；失败返回 false。
     */
    boolean setAppUninstallationPolicies(int mode, String[] appPackageNames);

    /**
     * 应用运行管
     * 控
     *
     * @param mode               0：黑名单(应用包名列表中的所有项都不允许运行)；
     *                           1：白名单（应用包名列表中的项如已安装，则强制运行）
     * @param appPackageNameList appPackageNameList：应用包名列表（含应用组件名）。当 appPackageNames 为空时，取消所
     *                           有已设定的应用。
     * @return
     */
    boolean setRunAppPolicies(int mode, String[] appPackageNameList);


    /**
     * @param commandline：Iptables 命令行。
     * @return
     */
    String executeShellToSetIptables(String commandline);


}
